<?php

/**
 * JsonResponse 响应服务
 */

namespace CbjCode\General\Providers;

use Illuminate\Http\JsonResponse;

/**
 * Class JsonProviders
 * @package App\Common\Providers
 */
class JsonProviders
{

    /**
     * 实例对象
     * @var null
     */
    private static $instance = null;

    /**
     * 状态码
     * @var int
     */
    private static $status = 200;

    /**
     * 响应头
     * @var array
     */
    private static $headers = [];

    /**
     * json key 配置
     * @var array|string[]
     */
    private static $config = [
        'code_field'=>'code',
        'type_field'=>'type',
        'message_field'=>'message',
        'result_field'=>'result'
    ];

    public function __construct()
    {
        $config = config("response_json");
        if ($config){
            self::$config = array_merge(self::$config,$config);
        }
    }

    /**
     * 单列定义
     * @return JsonProviders|null
     */
    public static function instance(){
        if (!self::$instance instanceof self) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    /**
     * 创建json响应
     * @param int $code
     * @param string $msg
     * @param array $data
     * @return JsonResponse
     */
    public static function make(int $code, string $msg, array $data = [])
    {
        $content = self::getContent($code,$msg,$data);
        return response()->json($content,self::$status,self::$headers);
    }

    /**
     * 设置状态码
     * @param int $status
     * @return $this
     */
    public function status(int $status): self
    {
        self::$status = $status;
        return $this;
    }

    /**
     * 设置头部
     * @param array $data
     * @return $this     */
    public function headers(array $data): self
    {
        self::$headers = $data;
        return $this;
    }

    /**
     * 返回成功信息
     * @param string $msg
     * @param array $data
     * @return JsonResponse
     */
    public static function success(string $msg = 'ok', array $data = [])
    {
        return self::make(0, $msg, $data);
    }

    /**
     * 返回错误信息
     * @param string $msg
     * @param array $data
     * @return JsonResponse
     */
    public static function error(string $msg = 'error', array $data = [])
    {
        return self::make(1, $msg, $data);
    }

    /**
     * 返回成功信息
     * @param string $msg
     * @param string $url
     * @param array $data
     * @return JsonResponse
     */
    public static function upload(string $msg = 'ok', string $url = "", array $data = [])
    {
        $content = self::getContent(0,$msg,$data);
        $content['url'] = $url;
        return response()->json($content,self::$status,self::$headers);
    }

    /**
     * 获取内容
     * @param int $code
     * @param string $msg
     * @param array $data
     * @return array
     */
    public static function getContent(int $code, string $msg, array $data = []){
        return array_combine(self::$config, [
            'code_field'=>$code,
            'type_field'=>$code?'error':'success',
            'message_field'=>$msg,
            'result_field'=>$data
        ]);
    }

    /**
     * 防止反序列化（这将创建它的副本）
     */
    public function __wakeup()
    {
        // TODO: Implement __wakeup() method.
    }

    /**
     * 防克隆
     */
    public function __clone()
    {
        // TODO: Implement __clone() method.
    }

}
